# -*- coding: utf-8 -*-
# @author: wch
# @file: filter2D.py
# @time: 2023/3/1 13:53
"""
    卷积 == 滤波
    卷积核的大小、锚点（卷积核的中心点）、边界扩充、步长

    卷积核一般为奇数，如3*3、5*5、7*7： 一方面是增加padding的原因，一方面是保证锚点在中间，防止放生位置的便宜
    卷积核的大小： 卷积核越大，看到的信息（感受野）越大，提取的特征越好，同是计算量也就越大
    锚点：卷积核的正中心
    边界的扩充：当卷积核大于1且不进行边界扩充，输出的尺寸将相应缩小
        当卷积核以标准方式进行边界扩充，则输出数据的空间尺寸将与输入相等

        N = （W-F +2P)/S +1
        N 表示 输出的尺寸
        W 表示输入的尺寸
        F 表示卷积核的尺寸
        P 表示扩充的边界
        S 表示步长
    步长；
    低通滤波 和 高通滤波

    低通滤波可以去噪或平滑图像  :低于某个阈值可以通过
    高通滤波可以查找图像的边缘  :高于某个阈值可以通过

    #图像的卷积
        filter2D(src,ddepth,kernel,anchor,delta,borderType)
        ddpeth 位深 8位或32位   可以设置为-1 与原图保持一致
        kernel核
        anchor 锚点
        delta  卷积后得到的元素加一个值，默认为0
        borderType 边框类型borderType 设置边框，默认不设置

    # 方盒滤波
       boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
       ddpeth 位深 8位或32位   可以设置为-1 与原图保持一致
       ksize ：kernelsize 卷积核的大小
        normalize = True ,a =1/（W*H）  :a 为卷积核卷积前一个系数 True则方盒滤波等同于均值滤波
        normalize = False，a =1
    # 均值滤波
        blur(src,ksize,anchor,borderType)

    # 高斯滤波 （钟形滤波：两边低，中间高）
        GaussianBlur(img,kernel,sigmaX,sigmaY,.....)
        img 原图
        kernel
        sigmaX x值的延展宽度（误差）
        sigmaY y值烟瘴的宽度（误差）

    # 中值滤波-----胡椒噪音
    mediaBlur（img，ksize）
        取卷积后的数组中的中间值作为结果值

    # 双边滤波 -美颜
        bilaterFilter(img,d,sigmaColor,sigmaSpace)
        sigColor 经常设置为20
        sigmaSpace 经常设置为50


    """

import cv2
import numpy as np

# filter2D
# img = cv2.imread("./media/dog.jpeg")
# kernel = np.ones((5, 5), np.float32) / 25
# dst = cv2.filter2D(img, -1, kernel)
# cv2.imshow("dst",dst)
# cv2.imshow("img",img)
# cv2.waitKey(0)

# 方盒滤波
# boxFilter(src,ddepth,ksize,anchor,normalize,borderType)

# 均值滤波 blur
# blur(src,ksize,anchor,borderType)
# img = cv2.imread("./media/dog.jpeg")
# dst = cv2.blur(img, (5,5))
# cv2.imshow("dst",dst)
# cv2.imshow("img",img)
# cv2.waitKey(0)

# 高斯滤波 两边低，中间高
# GaussianBlur(img,kernel,sigmaX,sigmaY,......)
# img =cv2.imread("./media/dog.jpeg")
# dst =cv2.GaussianBlur(img,(5,5),sigmaX =1)
# cv2.imshow("dst",dst)
# cv2.imshow("img",img)
# cv2.waitKey(0)


# 中值滤波 （胡椒噪音）
# medianBlur(img,ksize)
# img = cv2.imread("./media/dog.jpeg")
# dst = cv2.medianBlur(img,5)
# cv2.imshow("img",img)
# cv2.imshow("dst",dst)
# cv2.waitKey(0)


# 双边滤波 可以保留边缘，可以对边缘内进行处理（可以美颜）
# bilateraFilter(img,d,sigmaColor,sigSpace,......) # img 图像 d 直径（核大小） sigmaColor 边沿
img = cv2.imread("./media/dog.jpeg")
dst = cv2.bilateralFilter(img, 7, 20, 50)
cv2.imshow("dst", dst)
cv2.imshow("img", img)
cv2.waitKey(0)







